home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 309_01 / cc5.c < prev    next >
Text File  |  1990-03-18  |  7KB  |  383 lines

  1. /*
  2. HEADER:        Small-C source part 5;
  3. FILENAME:    CC5.C;
  4. AUTHORS:    Dieter H. Flunkert;
  5. COMPILERS:Turbo C V2.0 Medium Memory Model;
  6. SYSTEM: MSDOS (Brian Brown, Nov 1989)
  7. */
  8.  
  9. #include <stdio.h>
  10. #include "ccdef.c"
  11.  
  12. /* external function declaration */
  13. extern int add(), and(), asl(), asr(), blanks(), ch(), clearstage(),
  14.   div(), doublereg(), eq(), ge(), getlabel(), gt(), heir7(), immed(),
  15.   inbyte(), jump(), le(), loadsec(), lt(), match(), mod(), mult(),
  16.   needbrack(), needlval(), ne(), nl(), or(), outdec(), outstr(),
  17.   postlabel(), prelabel(), crs8label(), pop(), push(), pushsec(),
  18.   rvalue(), setstage(), store(), streq(), sub(), testjump(), testnoopt(), testtruejump(),
  19.   uge(), ugt(), ule(), ult(), xor();
  20.  
  21. /* external value declaration */
  22. extern int lptr, asmtype;
  23.  
  24. extern char *cptr, line[linesize];
  25.  
  26. doexpression()
  27. {
  28.  char *before, *start;
  29.  while(1) {
  30.   setstage(&before, &start);
  31.   expression();
  32.   clearstage(before, start);
  33.   if(ch() != ',') break;
  34.   inbyte();
  35.  }
  36. }
  37.  
  38. expression()
  39. {
  40.  int lval[8];
  41.  if(heir1(lval)) rvalue(lval);
  42. }
  43.  
  44. /* implemented +=, -=, *= etc. operator 13-jul-86  Dieter H. Flunkert */
  45. heir1(lval)
  46. int lval[];
  47. {
  48.  char *off_set;
  49.  int k, lval2[8];
  50.  lval[2]=lval[3]=1;
  51.  k=heir1a(lval);
  52.  blanks();
  53.  off_set = line + lptr;
  54.  if(streq(off_set, "+=") == 0)
  55.   if(streq(off_set, "-=") == 0)
  56.    if(streq(off_set, "*=") == 0)
  57.     if(streq(off_set, "/=") == 0)
  58.      if(streq(off_set, "%=") == 0)
  59.       if(streq(off_set, "<<=") == 0)
  60.        if(streq(off_set, ">>=") == 0)
  61.         if(streq(off_set,"&=") == 0)
  62.          if(streq(off_set, "|=") == 0)
  63.           if(streq(off_set, "^=") == 0)
  64.            if(ch() != '=') return k;
  65.  if(k==0) {
  66.    needlval();
  67.    return 0;
  68.  }
  69.  if(lval[1]) push();
  70.  else if(ch() != '=') {
  71.    immed();
  72.    outstr(*lval+name);
  73.    nl();
  74.    push();
  75.  }
  76.  if (match("=")) {
  77.   if(heir1(lval2)) rvalue(lval2);
  78.  }
  79.  else if(match("+=")) {
  80.   if(heir1(lval2)) rvalue(lval2);
  81.   loadsec();
  82.   pushsec();
  83.   if(cptr=lval[0])
  84.    if((cptr[ident] == pointer) && (cptr[type] == cint) && lval[2]) doublereg();
  85.   add();
  86.  }
  87.  else if(match("-=")) {
  88.   if(heir1(lval2)) rvalue(lval2);
  89.   loadsec();
  90.   pushsec();
  91.   if(cptr=lval[0])
  92.    if((cptr[ident] == pointer) && (cptr[type] == cint) && lval[2]) doublereg();
  93.   sub();
  94.  }
  95.  else if(match("*=")) {
  96.   if(heir1(lval2)) rvalue(lval2);
  97.   loadsec();
  98.   mult();
  99.  }
  100.  else if(match("/=")) {
  101.   if(heir1(lval2)) rvalue(lval2);
  102.   loadsec();
  103.   div();
  104.  }
  105.  else if(match("%=")) {
  106.   if(heir1(lval2)) rvalue(lval2);
  107.   loadsec();
  108.   mod();
  109.  }
  110.  else if(match(">>=")) {
  111.   if(heir1(lval2)) rvalue(lval2);
  112.   loadsec();
  113.   pushsec();
  114.   asr();
  115.  }
  116.  else if(match("<<=")) {
  117.   if(heir1(lval2)) rvalue(lval2);
  118.   loadsec();
  119.   pushsec();
  120.   asl();
  121.  }
  122.  else if(match("&=")) {
  123.   if(heir1(lval2)) rvalue(lval2);
  124.   loadsec();
  125.   pushsec();
  126.   and();
  127.  }
  128.  else if(match("^=")) {
  129.   if(heir1(lval2)) rvalue(lval2);
  130.   loadsec();
  131.   pushsec();
  132.   xor();
  133.  }
  134.  else if(match("|=")) {
  135.   if(heir1(lval2)) rvalue(lval2);
  136.   loadsec();
  137.   pushsec();
  138.   or();
  139.  }
  140.  store(lval);
  141.  return 0;
  142. }
  143.  
  144. /* '?:', '&&' and '||' operator implemented Dieter H. Flunkert 18-jul-86 */
  145. heir1a(lval)
  146.    int lval[];
  147. {
  148.    int k, lab, endlab;
  149.    k=heir1b(lval);
  150.    if(match("?")) {
  151.    if(k) rvalue(lval);
  152.     testjump(lab=getlabel());
  153.     endlab=getlabel();
  154.     if(heir1a(lval)) rvalue(lval);
  155.     jump(endlab);
  156.     needbrack(":");
  157.     prelabel(lab);
  158.     if(heir1a(lval)) rvalue(lval);
  159.     prelabel(endlab);
  160.     return 0;
  161.    }
  162.    else return k;
  163. }
  164.  
  165. heir1b(lval)
  166.    int lval[];
  167. {
  168.    int k, lval2[8], lab, endlab;
  169.    k=heir1c(lval);
  170.    blanks();
  171.    if(streq(line+lptr,"||") == 0) return k;
  172.    if(k) rvalue(lval);
  173.    while(1) {
  174.     if(match("||")) {
  175.      testtruejump(endlab=getlabel());
  176.      if(heir1c(lval2)) rvalue(lval2);
  177.      testtruejump(endlab);
  178.      immed();
  179.      outdec(0);nl();
  180.      jump(lab=getlabel());
  181.      prelabel(endlab);
  182.      immed();
  183.      outdec(1);nl();
  184.      prelabel(lab);
  185.     }
  186.     else return 0;
  187.    }
  188. }
  189.  
  190. heir1c(lval)
  191.    int lval[];
  192. {
  193.    int k, lval2[8], endlab;
  194.    k=heir2(lval);
  195.    blanks();
  196.    if(streq(line+lptr,"&&") == 0) return k;
  197.    if(k) rvalue(lval);
  198.    while(1) {
  199.     if(match("&&")) {
  200.      testnoopt(endlab=getlabel());
  201.      if(heir2(lval2)) rvalue(lval2);
  202.      testnoopt(endlab);
  203.      immed();
  204.      outdec(1);
  205.      nl();
  206.      prelabel(endlab);
  207.     }
  208.     else return 0;
  209.    }
  210. }
  211.  
  212. heir2(lval)
  213.  int lval[];
  214. { int k,lval2[8];
  215.  k=heir3(lval);
  216.  blanks();
  217.  if(ch()!='|')return (k);
  218.  if(streq(line+lptr,"|=")) return k;
  219.  if(k)rvalue(lval);
  220.  while(1)
  221.   {if(streq(line+lptr,"||")) return 0;
  222.   if (match("|"))
  223.    {push();
  224.    if(heir3(lval2)) rvalue(lval2);
  225.    or();
  226.    }
  227.   else return (0);
  228.   }
  229. }
  230.  
  231. heir3(lval)
  232.  int lval[];
  233. { int k,lval2[8];
  234.  k=heir4(lval);
  235.  blanks();
  236.  if(ch()!='^')return (k);
  237.  if(streq(line+lptr,"^=")) return k;
  238.  if(k)rvalue(lval);
  239.  while(1)
  240.   {if (match("^"))
  241.    {push();
  242.    if(heir4(lval2))rvalue(lval2);
  243.    xor();
  244.    }
  245.   else return (0);
  246.   }
  247. }
  248.  
  249. heir4(lval)
  250.  int lval[];
  251. { int k,lval2[8];
  252.  k=heir5(lval);
  253.  blanks();
  254.  if(ch()!='&')return (k);
  255.  if(streq(line+lptr,"&=")) return k;
  256.  if(k)rvalue(lval);
  257.  while(1)
  258.   {if(streq(line+lptr,"&&")) return 0;
  259.   if (match("&"))
  260.    {push();
  261.    if(heir5(lval2))rvalue(lval2);
  262.    and();
  263.    }
  264.   else return (0);
  265.   }
  266. }
  267.  
  268. heir5(lval)
  269.  int lval[];
  270. {
  271.  int k,lval2[8];
  272.  char *off_set;
  273.  k=heir6(lval);
  274.  off_set=line+lptr;
  275.  blanks();
  276.  if((streq(off_set,"==")==0)&&
  277.   (streq(off_set,"!=")==0))return (k);
  278.  if(k)rvalue(lval);
  279.  while(1)
  280.   {if (match("=="))
  281.    {push();
  282.    if(heir6(lval2))rvalue(lval2);
  283.    eq();
  284.    }
  285.   else if (match("!="))
  286.    {push();
  287.    if(heir6(lval2))rvalue(lval2);
  288.    ne();
  289.    }
  290.   else return (0);
  291.   }
  292. }
  293.  
  294. heir6(lval)
  295.  int lval[];
  296. {
  297.  int k,lval2[8];
  298.  char *off_set;
  299.  k=heir7(lval);
  300.  blanks();
  301.  off_set=line+lptr;
  302.  if((ch()!='<') & (ch() != '>') &
  303.  (streq(off_set,"<=")==0) & (streq(off_set,">=")==0)) return (k);
  304.  if(streq(off_set,">>"))return (k);
  305.  if(streq(off_set,"<<"))return (k);
  306.  if(streq(off_set,">>=")) return k;
  307.  if(streq(off_set,"<<=")) return k;
  308.  if(k)rvalue(lval);
  309.  while(1)
  310.   {if (match("<="))
  311.    {push();
  312.    if(heir7(lval2))rvalue(lval2);
  313.    if(cptr=lval[0])
  314.     if((cptr[ident]==pointer)&&lval[2])
  315.     {
  316.     ule();
  317.     continue;
  318.     }
  319.    if(cptr=lval2[0])
  320.     if((cptr[ident]==pointer)&&lval[2])
  321.     {
  322.     ule();
  323.     continue;
  324.     }
  325.    le();
  326.    }
  327.   else if (match(">="))
  328.    {push();
  329.    if(heir7(lval2))rvalue(lval2);
  330.    if(cptr=lval[0])
  331.     if((cptr[ident]==pointer)&&lval[2])
  332.     {
  333.     uge();
  334.     continue;
  335.     }
  336.    if(cptr=lval2[0])
  337.     if((cptr[ident]==pointer)&&lval[2])
  338.     {
  339.     uge();
  340.     continue;
  341.     }
  342.    ge();
  343.    }
  344.   else if(ch() == '<')
  345.    {inbyte();
  346.    push();
  347.    if(heir7(lval2))rvalue(lval2);
  348.    if(cptr=lval[0])
  349.     if((cptr[ident]==pointer)&&lval[2])
  350.     {
  351.     ult();
  352.     continue;
  353.     }
  354.    if(cptr=lval2[0])
  355.     if((cptr[ident]==pointer)&&lval[2])
  356.     {
  357.     ult();
  358.     continue;
  359.     }
  360.    lt();
  361.    }
  362.   else if(ch() == '>')
  363.    {inbyte();
  364.    push();
  365.    if(heir7(lval2))rvalue(lval2);
  366.    if(cptr=lval[0])
  367.     if((cptr[ident]==pointer)&&lval[2])
  368.     {
  369.     ugt();
  370.     continue;
  371.     }
  372.    if(cptr=lval2[0])
  373.     if((cptr[ident]==pointer)&&lval[2])
  374.     {
  375.     ugt();
  376.     continue;
  377.     }
  378.    gt();
  379.    }
  380.   else return (0);
  381.   }
  382. }
  383.